GtkHandleBoxPrivate *priv = hb->priv;
GtkBin *bin = GTK_BIN (widget);
GtkWidget *child;
- gint x, y, width, height;
+ gint width, height;
GdkRectangle rect;
gint handle_position;
GtkOrientation handle_orientation;
handle_position = effective_handle_position (hb);
- cairo_save (cr);
-
- gdk_window_get_origin (gtk_widget_get_window (widget), &x, &y);
- cairo_translate (cr, -x, -y);
- gdk_window_get_origin (priv->bin_window, &x, &y);
- cairo_translate (cr, x, y);
-
gdk_drawable_get_size (priv->bin_window, &width, &height);
gtk_cairo_paint_box (gtk_widget_get_style (widget),
rect.x, rect.y, rect.width, rect.height,
handle_orientation);
- cairo_restore (cr);
-
child = gtk_bin_get_child (bin);
if (child != NULL && gtk_widget_get_visible (child))
GTK_WIDGET_CLASS (gtk_handle_box_parent_class)->draw (widget, cr);
if (priv->child_detached)
gtk_handle_box_draw_ghost (hb, cr);
}
-
- if (gtk_cairo_should_draw_window (cr, priv->bin_window))
+ else if (gtk_cairo_should_draw_window (cr, priv->bin_window))
gtk_handle_box_paint (widget, cr);
return FALSE;
*/
void
_gtk_widget_draw_internal (GtkWidget *widget,
- cairo_t *cr)
+ cairo_t *cr,
+ gboolean clip_to_size)
{
if (!gtk_widget_is_drawable (widget))
return;
- cairo_rectangle (cr,
- 0, 0,
- widget->priv->allocation.width,
- widget->priv->allocation.height);
- cairo_clip (cr);
+ if (clip_to_size)
+ {
+ cairo_rectangle (cr,
+ 0, 0,
+ widget->priv->allocation.width,
+ widget->priv->allocation.height);
+ cairo_clip (cr);
+ }
if (gdk_cairo_get_clip_rectangle (cr, NULL))
{
gtk_widget_real_expose_event (GtkWidget *widget,
GdkEventExpose *expose)
{
- GdkWindow *window;
+ GdkWindow *window, *w;
gboolean result = FALSE;
cairo_t *cr;
+ int x, y;
if (!gtk_widget_is_drawable (widget))
return FALSE;
gdk_cairo_region (cr, expose->region);
cairo_clip (cr);
- /* translate cairo context properly */
- window = gtk_widget_get_window (widget);
- if (window != expose->window)
+ if (!gtk_widget_get_has_window (widget))
{
- int x, y;
-
- if (gdk_window_get_parent (expose->window) == window)
- {
- gdk_window_get_position (expose->window, &x, &y);
- }
- else
- {
- int ex, ey;
- gdk_window_get_origin (expose->window, &ex, &ey);
- gdk_window_get_origin (window, &x, &y);
- x = ex - x;
- y = ey - y;
- }
-
- cairo_translate (cr, -x, -y);
+ x = widget->priv->allocation.x;
+ y = widget->priv->allocation.y;
+ }
+ else
+ {
+ x = 0;
+ y = 0;
}
+ /* translate cairo context properly */
+ window = gtk_widget_get_window (widget);
- if (!gtk_widget_get_has_window (widget))
+ for (w = expose->window; w && w != window; w = gdk_window_get_parent (w))
{
- cairo_translate (cr,
- widget->priv->allocation.x,
- widget->priv->allocation.y);
+ int wx, wy;
+ gdk_window_get_position (w, &wx, &wy);
+ x -= wx;
+ y -= wy;
}
- _gtk_widget_draw_internal (widget, cr);
+ if (w)
+ cairo_translate (cr, x, y);
+
+ _gtk_widget_draw_internal (widget, cr, w != NULL);
/* unset here, so if someone keeps a reference to cr we
* don't leak the window. */